'\" t
.\"***************************************************************************
.\" Copyright 2018-2023,2024 Thomas E. Dickey                                *
.\" Copyright 1998-2015,2017 Free Software Foundation, Inc.                  *
.\"                                                                          *
.\" Permission is hereby granted, free of charge, to any person obtaining a  *
.\" copy of this software and associated documentation files (the            *
.\" "Software"), to deal in the Software without restriction, including      *
.\" without limitation the rights to use, copy, modify, merge, publish,      *
.\" distribute, distribute with modifications, sublicense, and/or sell       *
.\" copies of the Software, and to permit persons to whom the Software is    *
.\" furnished to do so, subject to the following conditions:                 *
.\"                                                                          *
.\" The above copyright notice and this permission notice shall be included  *
.\" in all copies or substantial portions of the Software.                   *
.\"                                                                          *
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
.\"                                                                          *
.\" Except as contained in this notice, the name(s) of the above copyright   *
.\" holders shall not be used in advertising or otherwise to promote the     *
.\" sale, use or other dealings in this Software without prior written       *
.\" authorization.                                                           *
.\"***************************************************************************
.\"
.\" $Id: curs_addch.3x,v 1.85 2024/04/20 19:03:47 tom Exp $
.TH curs_addch 3X 2024-04-20 "ncurses 6.5" "Library calls"
.ie \n(.g \{\
.ds `` \(lq
.ds '' \(rq
.ds '  \(aq
.ds ^  \(ha
.ds ~  \(ti
.\}
.el \{\
.ie t .ds `` ``
.el   .ds `` ""
.ie t .ds '' ''
.el   .ds '' ""
.ds       '  '
.ds       ^  ^
.ds       ~  ~
.\}
.
.de bP
.ie n  .IP \(bu 4
.el    .IP \(bu 2
..
.SH NAME
\fB\%addch\fP,
\fB\%waddch\fP,
\fB\%mvaddch\fP,
\fB\%mvwaddch\fP,
\fB\%echochar\fP,
\fB\%wechochar\fP \-
add a \fIcurses\fP character to a window and advance the cursor
.SH SYNOPSIS
.nf
\fB#include <curses.h>
.PP
\fBint addch(const chtype \fIch\fP);
\fBint waddch(WINDOW *\fIwin\fP, const chtype \fIch\fP);
\fBint mvaddch(int \fIy\fP, int \fIx\fP, const chtype \fIch\fP);
\fBint mvwaddch(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype \fIch\fP);
.PP
\fBint echochar(const chtype \fIch\fP);
\fBint wechochar(WINDOW *\fIwin\fP, const chtype \fIch\fP);
.fi
.SH DESCRIPTION
.SS "Adding Characters"
.B \%waddch
puts the character
.I ch
at the cursor position of window
.IR win ,
then advances the cursor position,
analogously to the standard C library's \fI\%putchar\fP(3).
\fB\%ncurses\fP(3X) describes the variants of this function.
.PP
If advancement occurs at the right margin,
.bP
the cursor automatically wraps to the beginning of the next line;
and
.bP
at the bottom of the current scrolling region,
and if \fB\%scrollok\fP(3X) is enabled for
.IR win ,
the scrolling region scrolls up one line.
.PP
If
.I ch
is a
backspace,
carriage return,
line feed,
or
tab,
the cursor moves appropriately within the window.
.bP
Backspace moves the cursor one character left;
at the left margin of a window,
it does nothing.
.bP
Carriage return moves the cursor to the left margin on the current line
of the window.
.bP
Line feed does a \fB\%clrtoeol\fP(3X),
then moves the cursor to the left margin on the next line of the window,
and if \fB\%scrollok\fP(3X) is enabled for
.IR win ,
scrolls the window if the cursor was already on the last line.
.bP
Tab advances the cursor to the next tab stop
(possibly on the next line);
these are placed at every eighth column by default.
Alter the tab interval with the
.B \%TABSIZE
extension;
see \fB\%curs_variables\fP(3X).
.PP
If
.I ch
is any other nonprintable character,
it is drawn in printable form,
using the same convention as \fB\%unctrl\fP(3X).
.PP
Calling \fB\%winch\fP(3X) on the location of a nonprintable character
does not return the character itself,
but its \fB\%unctrl\fP(3X) representation.
.PP
.I ch
may contain rendering and/or color attributes,
and others can be combined with the parameter
by logically \*(``or\*(''ing with it.
(A character with its attributes can be copied from place to place
using \fB\%winch\fP(3X) and
.BR \%waddch .)
See \fB\%curs_attr\fP(3X) for values of predefined video attribute
constants that can be usefully \*(``or\*(''ed with characters.
.SS "Echoing Characters"
.B \%echochar
and
.B \%wechochar
are equivalent to calling
.RB \%( w ) addch
followed by
.RB \%( w ) refresh .
.I curses
interprets these functions as a hint that only a single character is
being output;
for non-control characters,
a considerable performance gain may be enjoyed by employing them.
.\" TODO: Combine the following with the "Line Drawing" subsection of
.\" terminfo(5) and replace this with a cross reference there.
.SS "Forms-Drawing Characters"
.I curses
defines macros starting with
.B \%ACS_
that can be used with
.B \%waddch
to write line-drawing and other special characters to the screen.
.I \%ncurses
terms these
.I "forms-drawing characters."
The ACS default listed below is used if the
.B \%acs_chars
.RB ( \%acsc )
.I \%term\%info
capability does not define a terminal-specific replacement for it,
or if the terminal and locale configuration requires Unicode to access
these characters but the library is unable to use Unicode.
The \*(``acsc char\*('' column corresponds to how the characters are
specified in the
.B \%acs_chars
string capability,
and the characters in it may appear on the screen if the terminal's
database entry incorrectly advertises ACS support.
The name \*(``ACS\*('' originates in the Alternate Character Set feature
of the DEC VT100 terminal.
.PP
.TS
Lb Lb Lb Lb
Lb Lb Lb Lb
Lb L  L  Lx.
\&	ACS	acsc	\&
Symbol	Default	char	Glyph Name
_
ACS_BLOCK	#	0	solid square block
ACS_BOARD	#	h	board of squares
ACS_BTEE	+	v	bottom tee
ACS_BULLET	o	\*~	bullet
ACS_CKBOARD	:	a	checker board (stipple)
ACS_DARROW	v	.	arrow pointing down
ACS_DEGREE	\*'	f	degree symbol
ACS_DIAMOND	+	\(ga	diamond
ACS_GEQUAL	>	>	greater-than-or-equal-to
ACS_HLINE	\-	q	horizontal line
ACS_LANTERN	#	i	lantern symbol
ACS_LARROW	<	,	arrow pointing left
ACS_LEQUAL	<	y	less-than-or-equal-to
ACS_LLCORNER	+	m	lower left-hand corner
ACS_LRCORNER	+	j	lower right-hand corner
ACS_LTEE	+	t	left tee
ACS_NEQUAL	!	|	not-equal
ACS_PI	*	{	greek pi
ACS_PLMINUS	#	g	plus/minus
ACS_PLUS	+	n	plus
ACS_RARROW	>	+	arrow pointing right
ACS_RTEE	+	u	right tee
ACS_S1	\-	o	scan line 1
ACS_S3	\-	p	scan line 3
ACS_S7	\-	r	scan line 7
ACS_S9	\&_	s	scan line 9
ACS_STERLING	f	}	pound-sterling symbol
ACS_TTEE	+	w	top tee
ACS_UARROW	\*^	\-	arrow pointing up
ACS_ULCORNER	+	l	upper left-hand corner
ACS_URCORNER	+	k	upper right-hand corner
ACS_VLINE	|	x	vertical line
.TE
.SH RETURN VALUE
These functions return
.B OK
on success and
.B ERR
on failure.
.PP
In
.IR \%ncurses ,
.B \%waddch
returns
.B ERR
if it is not possible to add a complete character at the cursor
position,
as when conversion of a multibyte character to a byte sequence fails,
or at least one of the resulting bytes cannot be added to the window.
See section \*(``PORTABILITY\*('' below regarding the use of
.B \%waddch
with multibyte characters.
.PP
.B \%waddch
can successfully write a character at the bottom right location of the
window.
However,
.I \%ncurses
returns
.B ERR
if \fB\%scrollok\fP(3X) is not enabled in that event,
because it is not possible to wrap to a new line.
.PP
Functions prefixed with \*(``mv\*('' first perform cursor movement and
fail if the position
.RI ( y ,
.IR x )
is outside the window boundaries.
.SH NOTES
.BR \%addch ,
.BR \%mvaddch ,
.BR \%mvwaddch ,
and
.B \%echochar
may be implemented as macros.
.SH PORTABILITY
X/Open Curses,
Issue 4 describes these functions.
It specifies no error conditions for them.
.PP
SVr4
.I curses
describes a successful return value only as
\*(``an integer value other than
.BR ERR \*(''.
.PP
The defaults specified for forms-drawing characters apply in the POSIX
locale.
.SS "ACS Symbols"
X/Open Curses states that the
.B \%ACS_
definitions are
.I char
constants.
.PP
Some implementations are problematic.
.bP
Solaris
.IR curses ,
for example,
define the ACS symbols as constants;
others define them as elements of an array.
.IP
This implementation uses an array,
.BR \%acs_map ,
as did SVr4
.IR curses .
NetBSD also uses an array,
actually named
.BR \%_acs_char ,
with a
.B \%#define
for compatibility.
.bP
HP-UX
.I curses
equates some of the
.B \%ACS_
symbols to the analogous
.B \%WACS_
symbols as if the
.B \%ACS_
symbols were wide characters
(see \fB\%curs_add_wch\fP(3X)).
The misdefined symbols are the arrows and others that are not used for
line drawing.
.bP
X/Open Curses
(Issues 2 through 7)
has a typographical error
for the
.B \%ACS_LANTERN
symbol, equating its \*(``VT100+ Character\*('' to \*(``I\*(''
(capital I),
while the header files for SVr4
.I curses
and other implementations use \*(``i\*(''
(small i).
.IP
None of the terminal descriptions on Unix platforms use uppercase I,
except for Solaris
(in its
.I \%term\%info
entry for \fI\%screen\fP(1),
apparently based on the X/Open documentation around 1995).
On the other hand,
its
.B \%gs6300
(AT&T PC6300 with EMOTS Terminal Emulator)
description uses lowercase i.
.PP
Some ACS symbols
.RB ( \%ACS_S3 ,
.BR \%ACS_S7 ,
.BR \%ACS_LEQUAL ,
.BR \%ACS_GEQUAL ,
.BR \%ACS_PI ,
.BR \%ACS_NEQUAL ,
and
.BR \%ACS_STERLING )
were not documented in any publicly released System\ V.
However,
many publicly available
.I \%term\%info
entries include
.B \%acsc
strings in which their key characters
.BR ( pryz{|} )
are embedded,
and a second-hand list of their character descriptions has come to
light.
The
.I \%ncurses
developers invented ACS-prefixed names for them.
.PP
The
.I displayed
values of
.B \%ACS_
constants depend on
.bP
the
.I \%ncurses
ABI\(emfor example,
wide-character versus non-wide-character configurations
(the former is capable of displaying Unicode while the latter is not),
and
.bP
whether the locale uses UTF-8 encoding.
.PP
In certain cases,
the terminal is unable to display forms-drawing characters
.I except
by using UTF-8;
see the discussion of the
.I \%NCURSES_NO_UTF8_ACS
environment variable in \fB\%ncurses\fP(3X)).
.SS "Character Set"
X/Open Curses assumes that the parameter passed to
.B \%waddch
contains a single character.
As discussed in \fB\%curs_attr\fP(3X),
that character may have been more than eight bits wide in an SVr3 or
SVr4 implementation,
but in the X/Open Curses model,
the details are not given.
The important distinction between SVr4
.I curses
and X/Open Curses is that the latter separates non-character information
(attributes and color)
from the character code,
which SVr4 packs into a
.I \%chtype
for passage to
.BR \%waddch .
.PP
In
.IR \%ncurses ,
.I \%chtype
holds an eight-bit character.
But the library allows a multibyte character to be passed in a
succession of calls to
.BR \%waddch .
Other implementations do not;
a
.B \%waddch
call transmits exactly one character,
which may be rendered in one or more screen locations depending on
whether it is printable.
.PP
Depending on the locale settings,
.I \%ncurses
inspects the byte passed in each
.B \%waddch
call,
and checks whether the latest call continues a multibyte sequence.
When a character is
.IR complete ,
.I \%ncurses
displays the character and advances the cursor.
.PP
If the calling application interrupts the succession of bytes in
a multibyte character sequence by changing the current location\(emfor
example,
with \fB\%wmove\fP(3X)\(em\c
.I \%ncurses
discards the incomplete character.
.PP
For portability to other implementations,
do not rely upon this behavior.
Check whether a character can be represented as a single byte in the
current locale.
.bP
If it can,
call either
.B \%waddch
or \fB\%wadd_wch\fP(3X).
.bP
If it cannot,
use only
\fB\%wadd_wch\fP(3X).
.SS TABSIZE
SVr4 and other versions of
.I curses
implement the
.B \%TABSIZE
variable,
but X/Open Curses does not specify it
(see \fB\%curs_variables\fP(3X)).
.SH SEE ALSO
\fB\%curs_add_wch\fP(3X) describes comparable functions of the
.I \%ncurses
library in its wide-character configuration
.RI ( \%ncursesw ).
.PP
\fB\%curses\fP(3X),
\fB\%curs_addchstr\fP(3X),
\fB\%curs_addstr\fP(3X),
\fB\%curs_attr\fP(3X),
\fB\%curs_clear\fP(3X),
\fB\%curs_inch\fP(3X),
\fB\%curs_outopts\fP(3X),
\fB\%curs_refresh\fP(3X),
\fB\%curs_variables\fP(3X),
\fB\%putchar\fP(3)
